package com.tedu.api.ee;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 流---传输数据---传输数据过程绝对不能出错【处理手段】
 *  * 标准流结合一场---标准IO
 *
 * 异常
 * Java面向对象语言，程序中所出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误---有解决方案
 *               编译期：RunTimeException异常表示类
 *                      FileOutputStream创建对象---波浪线---抛出方法之外
 *                检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *                解决方案：①捕获异常（*）
 *                         ②抛出异常---抛出方法之外--打印控制台
 *               运行期：控制台直接显示异常对象【异常对象名字：产生原因】
 *               非检查异常：控制台输出异常对象名称，RunTimeException异常表示
 *               最后了解【throw与throws---RunTimeException】
 * Error错误：描述系统级别的错误---出现---程序宕机
 *            非常低--->递归错误--->
 */
public class EE {
    /**
     * Error  错误---程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     * ----程序宕机----后台：9亿账号
     * while(true){
     * 拼接字符串对象
     * }
     */
    public static void method() {
        method();
    }

    @Test
    public void testError() {
        EE.method();
    }

    /**
     * Exception异常：检查异常【出现编译期】---代码报波浪线
     * 两种手段：①捕获异常
     * 语法：try{
     * 怀疑代码可能有异常或者提示异常
     * }catch(小异常名字 e){
     * e.printStacktrace(); 打印异常信息
     * }catch(中异常名字 e){
     * e.printStacktrace(); 打印异常信息
     * }catch(大异常名字 e){      Exception
     * e.printStacktrace(); 打印异常信息
     * }finally{
     * 一定执行代码块
     * }
     * 快捷键：ctrl+alt+T
     * <p>
     * ②抛出异常 throw  异常名字
     * 考试题：throw与throws
     * 非检查异常【出现运行期】---代码无错误---控制台
     * ----------------------
     * 异常：FileNotFoundException   文件不存在异常
     * 产生原因：路径写错、文件名写错
     * 异常：NullPointerException    空指针异常
     * 产生原因：获取字符串为空，数组：值为空，集合：元素为空【存在null值】
     * 异常：StringIndexOutOfBoundsException  字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     * 异常：NumberFormatException   数字转换异常
     * 产生原因：字符串不是正确的类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译期】---代码报波浪线
        //FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---控制台
        try {
            String str = "a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str); //解析字符串--转换为对应类型
        } catch (StringIndexOutOfBoundsException e) {
            e.printStackTrace(); //打印异常信息
            System.out.println("字符串小异常：下标越界异常~~");
        } catch (NumberFormatException e) {
            e.printStackTrace();   //打印异常信息
            System.out.println("字符串小异常~~");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("大异常~~");
        } finally {
            System.out.println("一定执行代码块");
        }
    }

    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示：查API---java.lang.异常
     * 字符串、包装类、集合、IO流
     */
    @Test
    public void testHomeWork1() {

     /* try {
          Class<?> c= Class.forName("java.util.ArrayList");
          Field field=c.getDeclaredField("nonExistentFiled");
          System.out.println("输出1: ");
      }catch (ClassNotFoundException e){
          System.out.println("输出2: ");
      } catch (NoSuchFieldException e) {
          e.printStackTrace();
          System.out.println("输出3: ");
      }*/

            //java.lang.TypeNotPresentException

        /*try{
            List<String> list=null;
            ParameterizedType type=(ParameterizedType) list;
            Class<?> elementType=(Class<?>) type.getActualTypeArguments()[0];
            System.out.println("输出结果: "+elementType.getName());
        }catch (NullPointerException e){
            System.out.println();
        }catch (TypeNotPresentException e){
            System.out.println("输出: "+e.getMessage());
        }finally {
            System.out.println("一定执行的代码块");
        }*/

       /* try (ObjectInputStream asd=new ObjectInputStream(new FileInputStream("data"))){
            Object o= asd.readFields();
        }catch (StreamCorruptedException e){
            System.out.println("损坏");
        }catch (IOException | ClassNotFoundException e){
            System.out.println("输出错误: "+e.getMessage());
        }finally {
            System.out.println();
        }*/


            //3.包装类异常: java.lang.NegativeArraySizeException
            //            抛出一个应用程序尝试创建一个负数大小的数组
       /*try{
           int[] negativeLengthArray=new int[-1];
    }catch(NegativeArraySizeException e){
        System.out.println("捕获异常: "+e.getClass().getName());
           System.out.println("异常描述: "+e.getMessage());
           e.printStackTrace();
    }*/


        /*SimpleDateFormat sdf=new SimpleDateFormat("2024-10-24");
        sdf.setLenient(false);
        try{
            String date = null;
            Date parseDate= sdf.parse(null);
            System.out.println("输出: "+parseDate);
        } catch (ParseException e) {
            try {
                throw new IllegalAccessException("再次输出: ");
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
            } finally {
                System.out.println("最终输出: ");
            }
        }*/


       /* FileOutputStream xcv=new FileOutputStream("example.txt");
        FileInputStream fis=null;
        BufferedInputStream bis=null;
        try {
            fis=new FileInputStream("example.txt");
            bis=new BufferedInputStream(fis);
            while (true){
                int data= 0;
                try {
                    data = bis.read();
                } catch (EOFException e) {
                    e.printStackTrace();
                } finally {
                }
                System.out.println("读取: "+data);
            }
        }catch (IOException e){
            System.out.println("."+e.getMessage());
        }finally {
          try {

          if (bis!=null){
              bis.close();
          }

          if (fis!=null){

              fis.close();
          }
             }catch (IOException e){
              System.out.println("出现错误: "+e.getMessage());
          }
             }*/
        }

       }


